package com.ww.sound_emission.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;

public class DateUtils {

    // 常用日期时间格式常量
    public static final String FORMAT_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static final String FORMAT_YYYY_MM_DD = "yyyy-MM-dd";
    public static final String HH_MM = "HH:mm";
    public static final String HH_MM_SS = "HH:mm:ss";

    /**
     * 将日期时间字符串转换为毫秒级时间戳。
     *
     * @param dateTimeString 日期时间字符串
     * @param pattern        日期时间格式
     * @return 毫秒级时间戳
     * @throws ParseException 如果日期时间字符串格式不正确，则抛出 ParseException 异常
     */
    public static long toMilliseconds(String dateTimeString, String pattern) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
        try {
            return dateFormat.parse(dateTimeString).getTime();
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 将毫秒级时间戳转换为日期时间字符串。
     *
     * @param milliseconds 毫秒级时间戳
     * @param pattern      日期时间格式
     * @return 日期时间字符串
     */
    public static String toString(Long milliseconds, String pattern) {
        // 将长整型转换为 Instant 对象
        Instant instant = Instant.ofEpochMilli(milliseconds);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        return dateTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 将日期时间字符串转换为 LocalDateTime 对象。
     *
     * @param dateTimeString 日期时间字符串
     * @param pattern        日期时间格式
     * @return LocalDateTime 对象
     */
    public static LocalDateTime toLocalDateTime(String dateTimeString, String pattern) {
        return LocalDateTime.parse(dateTimeString, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 将 LocalDateTime 对象转换为日期时间字符串。
     *
     * @param dateTime LocalDateTime 对象
     * @return 日期时间字符串
     */
    public static String toString(LocalDateTime dateTime) {
        return dateTime.format(DateTimeFormatter.ofPattern(FORMAT_YYYY_MM_DD_HH_MM_SS));
    }

    /**
     * 将 LocalDate 对象转换为日期字符串。
     *
     * @param localDate LocalDate 对象
     * @return 日期字符串
     */
    public static String toString(LocalDate localDate) {
        return localDate.format(DateTimeFormatter.ofPattern(FORMAT_YYYY_MM_DD));
    }

    /**
     * 将 LocalDateTime 对象转换为毫秒级时间戳。
     *
     * @param dateTime LocalDateTime 对象
     * @return 毫秒级时间戳
     */
    public static long toMilliseconds(LocalDateTime dateTime) {
        return dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    }

    /**
     * 将毫秒级时间戳转换为 Instant 对象。
     *
     * @param milliseconds 毫秒级时间戳
     * @return Instant 对象
     */
    public static Instant toInstant(long milliseconds) {
        return Instant.ofEpochMilli(milliseconds);
    }

    /**
     * 将 Instant 对象转换为毫秒级时间戳。
     *
     * @param instant Instant 对象
     * @return 毫秒级时间戳
     */
    public static long toMilliseconds(Instant instant) {
        return instant.toEpochMilli();
    }

    /**
     * 将 Instant 对象转换为 LocalDateTime 对象。
     *
     * @param instant Instant 对象
     * @return LocalDateTime 对象
     */
    public static LocalDateTime toLocalDateTime(Instant instant) {
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

    /**
     * 将毫秒级时间戳转换为 LocalDateTime 对象。
     *
     * @param milliseconds 毫秒级时间戳
     * @return LocalDateTime 对象
     */
    public static LocalDateTime toLocalDateTime(Long milliseconds) {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(milliseconds), ZoneId.systemDefault());
    }



    /**
     * 将秒级时间转换为小时 long 对象。
     *
     * @param seconds 毫秒级时间戳
     * @return LocalDateTime 对象
     */
    public static long secondsToHours(long seconds) {
        return seconds / 3600; // 将秒转换为小时
    }

    /**
     * 将秒级时间转换为分钟 long 对象。
     *
     * @param seconds 秒级时间戳
     * @return 分钟数
     */
    public static int secondsToMinutes(long seconds) {
        return Math.round(seconds / 60.0f); // 将秒转换为分钟
    }

    /**
     * 将 LocalDateTime 对象转换为 Instant 对象。
     *
     * @param dateTime LocalDateTime 对象
     * @return Instant 对象
     */
    public static Instant toInstant(LocalDateTime dateTime) {
        return dateTime.atZone(ZoneId.systemDefault()).toInstant();
    }

    /**
     * 判断时间是否在两个时间字符串之间
     */
    public static boolean isBetween(String time, String startTime, String endTime) {
        return time.compareTo(startTime) >= 0 && time.compareTo(endTime) <= 0;
    }

    // 计算两个时间点之间的时间差
    public static long timeDifference(long startTime, long endTime) {
        Duration duration = Duration.between( Instant.ofEpochMilli(startTime), Instant.ofEpochMilli(endTime));
        return duration.getSeconds();
    }

    /**
     * 格式化两个时间戳之间的时间差为时分秒格式。
     *
     * @param startTimeInMillis 开始时间戳（毫秒）
     * @param endTimeInMillis   结束时间戳（毫秒）
     * @return 格式化后的时分秒字符串
     */
    public static String formatDurationBetween(long startTimeInMillis, long endTimeInMillis) {
        Duration duration = Duration.between( Instant.ofEpochMilli(startTimeInMillis), Instant.ofEpochMilli(endTimeInMillis));
        long hours = duration.toHours();
        long remainingMinutes = duration.toMinutes() % 60;
        long seconds = duration.getSeconds() % 60;
        return String.format("%02d:%02d:%02d", hours, remainingMinutes, seconds);
    }

    public static void main(String[] args) {
        //1717070395027		0	1717113596326
        System.out.println(DateUtils.formatDurationBetween(1718854621016L,1718854638352L));
    }
}
